---
title: Configuring EAS Metadata
sidebar_title: store.config.json
description: Learn about different ways to configure EAS Metadata.
---

import { CodeBlocksTable } from '~/components/plugins/CodeBlocksTable';

> **important** **EAS Metadata** is in preview and subject to breaking changes.

EAS Metadata is configured by a **store.config.json** file at the _root of your project_.

You can configure the path or name of the store config file with the **eas.json** [`metadataPath`](../../submit/eas-json.mdx#metadatapath) property.
Besides the default JSON format, EAS Metadata also supports more dynamic config using JavaScript files.

## Static store config

The default store config type for EAS Metadata is a simple JSON file.
The code snippet below shows an example store config with basic App Store information written in English (U.S.).

You can find all configuration options in the [store config schema](/eas/metadata/schema/).

> If you have the [VS Code Expo Tools extension](https://github.com/expo/vscode-expo#readme) installed, you get auto-complete, suggestions, and warnings for **store.config.json** files.

```json store.config.json
{
  "configVersion": 0,
  "apple": {
    "info": {
      "en-US": {
        "title": "Awesome App",
        "subtitle": "Your self-made awesome app",
        "description": "The most awesome app you have ever seen",
        "keywords": ["awesome", "app"],
        "marketingUrl": "https://example.com/en/promo",
        "supportUrl": "https://example.com/en/support",
        "privacyPolicyUrl": "https://example.com/en/privacy"
      }
    }
  }
}
```

## Dynamic store config

At times, Metadata properties can benefit from dynamic values. For example, the Metadata **copyright notice** should contain the current year. This can be automated with EAS Metadata.

To generate content dynamically, start by creating a JavaScript config file **store.config.js**. Then, use the [`metadataPath`](/eas/json/#metadatapath) property in the **eas.json** file to pick the JS config file.

> `eas metadata:pull` can't update dynamic store config files. Instead, it creates a JSON file with the same name as the configured file. You can import the JSON file to reuse the data from `eas metadata:pull`.

<CodeBlocksTable tabs={['store.config.js', 'eas.json']}>

```js
// Use the data from `eas metadata:pull`
const config = require('./store.config.json');

const year = new Date().getFullYear();
config.apple.copyright = `${year} Acme, Inc.`;

module.exports = config;
```

```json
{
  "submit": {
    "production": {
      "ios": {
        "metadataPath": "./store.config.js"
      }
    }
  }
}
```

</CodeBlocksTable>

## Store config with external content

When using external services for localizations, you have to fetch external content.
EAS Metadata supports synchronous and asynchronous functions exported from dynamic store config files.
The function results are awaited before validating and syncing with the stores.

> The **store.config.js** function is evaluated in Node.js. If you need special values, like secrets, use environment variables.

<CodeBlocksTable tabs={['store.config.js', 'eas.json']}>

```js
// Use the data from `eas metadata:pull`
const config = require('./store.config.json');

module.exports = async () => {
  const year = new Date().getFullYear();
  const info = await fetchLocalizations('...').then(response => response.json());

  config.apple.copyright = `${year} Acme, Inc.`;
  config.apple.info = info;

  return config;
};
```

```json
{
  "submit": {
    "production": {
      "ios": {
        "metadataPath": "./store.config.js"
      }
    }
  }
}
```

</CodeBlocksTable>
